﻿using LigerUi.MVC.DataModel.EntityClasses.Models;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;

namespace LigerUi.MVC.DataModel.EntityClasses
{
    /// <summary>
    /// 只有在没有数据库的时候才会根据数据库连接配置创建新的数据库。这种配置主要用于production环境，
    /// 因为你不可能把你现在使用的数据库删除掉，那样会损失重要的数据。
    /// 你需要让你的实施人员拿着与Fluent API配置对应的数据库脚本去更新数据库。
    /// </summary>
    public class CreateDatabaseIfNotExistsMap : CreateDatabaseIfNotExists<MVCEntities>
    {
        protected override void Seed(MVCEntities context)
        {
            context.PhoneAttributions.Add(new PhoneAttribution { AreaCode = "武汉", CardType = "省会", City = "wuhan", Number = "4300" });
        }
    }

    /// <summary>
    /// 不管数据库映射或者model是否发生变化，每次都重新删除并根据配置重建数据库。
    /// 这种方式可以适用于一些特殊情况的测试，比如说当每次测试结束之后把所有的测试数据都删除掉，
    /// 并且在测试开始前插入一些基础数据。
    /// </summary>
    public class DropCreateDatabaseAlwaysMap : DropCreateDatabaseAlways<MVCEntities>
    {
        protected override void Seed(MVCEntities context)
        {
            context.PhoneAttributions.Add(new PhoneAttribution { AreaCode = "武汉", CardType = "省会", City = "wuhan", Number = "4300" });
        }
    }

    /// <summary>
    /// 只要Fluent API配置的数据库映射发生变化或者domain中的model发生变化了，
    /// 就把以前的数据库删除掉，根据新的配置重新建立数据库。
    /// 这种方式比较适合开发数据库，可以减少开发人员的工作量。
    /// </summary>
    public class DropCreateDatabaseIfModelChangesMap : DropCreateDatabaseIfModelChanges<MVCEntities>
    {
        protected override void Seed(MVCEntities context)
        {
            context.PhoneAttributions.Add(new PhoneAttribution { AreaCode = "武汉", CardType = "省会", City = "wuhan", Number = "4300" });
        }
    }

    /// <summary>
    /// 自动创建表，如果Entity有改到就更新到表结构
    /// </summary>
    //public class MigrateDatabaseToLatestVersionMap : MigrateDatabaseToLatestVersion<MVCEntities, ReportingDbMigrationsConfiguration>
    //{
    //    protected override void Seed(MVCEntities context)
    //    {
    //        context.PhoneAttributions.Add(new PhoneAttribution { AreaCode = "武汉", CardType = "省会", City = "wuhan", Number = "4300" });
    //    }
    //}
}
